package com.dodoke.myBatis.utils;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.Reader;

/**
 * MyBatisUtils工具类，创建全局唯一的SqlSessionFactory对象
 */
public class MyBatisUtils {
    //设置私有静态属性，因为静态内容属于类而不属于对象，且拥有全局唯一的特性
    private static SqlSessionFactory sqlSessionFactory = null;
    //利用静态代码块在初始化类时实例化sqlSessionFactory属性
    /**
     * 关于为什么先设置null
     * 一i那位在构建SQLSessionFactory对象时，没有任何的异常提示，而且该对象的构建又非常重要
     * 所以需要去主动加上错误提示
     */
    static {
        try {
            Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        } catch (IOException e) {
            e.printStackTrace();
            //需要抛出初始化的异常，并且传入捕捉到的异常，形成一条完整的异常链
            //以便于通知调用者
            throw new ExceptionInInitializerError(e);
        }
    }

    /**
     * 获取数据库交互SqlSession
     * @return SqlSession对象
     */
    public static SqlSession openSqlSession() {
        return sqlSessionFactory.openSession();
    }

    /**
     * 释放一个有效的SqlSession对象
     * @param sqlSession 准备释放的SqlSession对象
     */
    public static void closeSqlSession(SqlSession sqlSession) {
        if(sqlSession != null) {
            sqlSession.close();
        }
    }

}
